#ifndef DATAPACKAGE_H
#define DATAPACKAGE_H
#include "Format.h"
#include <QString>
#include <winsock2.h>
#include <QTreeWidget>



class DataPackage
{
public:
    DataPackage();
    void setDataLength(u_int data_length);  // 设置数据包长度
    void setTimeStmp(QString timeStmp);  // 设置时间戳
    void setInfo(QString info);  // 设置信息
    void setPackageType(int type);  // 设置包类型
    void setPointer(const u_char* pkt_content,int size);  // 设置数据包内容指针
/*************** 获取数据包数据 ***********************/
    QString getDataLength();  // 获取数据包长度
    QString getTimeStmp();  // 获取时间戳
    QString getInfo();  // 获取信息
    QString getPackageType();  // 获取包类型
    QString getSource();  // 获取源地址
    QString getDestination();  // 获取目标地址

    u_int getDataLengthInt();  // 获取数据包长度（整数）
    int getPackageTypeInt();  // 获取包类型（整数）
/*************** 获取mac数据 ***********************/
    QString getDesMacAddr();  // 获取目标MAC地址
    QString getSrcMacAddr();  // 获取源MAC地址
    QString getMacType();  // 获取MAC类型
/*************** 获取IP数据 ***********************/
    QList<QTreeWidgetItem*> getIp();  // 获取IP相关信息
    QString getDesIpAddr();  // 获取目标IP地址
    QString getSrcIpAddr();  // 获取源IP地址
    QString getIpVersion();  // 获取IP版本
    QString getIpHeaderLength();  // 获取IP头部长度
    QString getIpTotalLength();  // 获取IP总长度
    QString getIpTTL();  // 获取IP生存时间
    QString getIpProtocol();  // 获取IP协议
/*************** 获取ARP数据 ***********************/
    QList<QTreeWidgetItem*> getArp();  // 获取ARP相关信息
    QString getArpHType();  // 获取ARP硬件类型
    QString getArpOp();  // 获取ARP操作码
    QString getArpPType();  // 获取ARP协议类型
    QString getArpSMacAddr();  // 获取ARP源MAC地址
    QString getArpTMacAddr();  // 获取ARP目标MAC地址
    QString getArpSIpAddr();  // 获取ARP源IP地址
    QString getArpTIpAddr();  // 获取ARP目标IP地址
/*************** 获取TCP数据 ***********************/
    QString getTcpSrcPort();  // 获取TCP源端口
    QString getTcpDesPort();  // 获取TCP目标端口
    QString getTcpSeq();  // 获取TCP序列号
    QString getTcpAck();  // 获取TCP确认号
/*************** 获取UDP数据 ***********************/
    QString getUdpSrcPort();  // 获取UDP源端口
    QString getUdpDesPort();  // 获取UDP目标端口
    QString getUdpLength();  // 获取UDP长度
/*************** 获取ICMP数据 ***********************/
    QList<QTreeWidgetItem*> getIcmp();  // 获取ICMP相关信息
    QString getIcmpType();  // 获取ICMP类型
    QString getIcmpCode();  // 获取ICMP代码
    QString getIcmpCheckSum();  // 获取ICMP校验和
    QString getIcmpId();  // 获取ICMP标识符
    QString getIcmpSeq();  // 获取ICMP序列号
/*************** 获取DNS数据 ***********************/
    QList<QTreeWidgetItem*> getDns();  // 获取DNS相关信息
    QList<QTreeWidgetItem*> getDnsFlagInfo();  // 获取DNS标志信息
    QString getDnsId();  // 获取DNS标识符
    QString getDnsFlags();  // 获取DNS标志
    QString getDnsFlagsQR();  // 获取DNS查询/响应标志
    QString getDnsFlagsOpcode();  // 获取DNS操作码
    QString getDnsFlagsAA();  // 获取DNS授权应答标志
    QString getDnsFlagsTC();  // 获取DNS截断标志
    QString getDnsFlagsRD();  // 获取DNS期望递归标志
    QString getDnsFlagsRA();  // 获取DNS递归可用标志
    QString getDnsFlagsZ();  // 获取DNS保留字段
    QString getDnsFlagsRcode();  // 获取DNS响应码
    QString getDnsQuestionNumber();  // 获取DNS问题数
    QString getDnsAnswerNumber();  // 获取DNS回答数
    QString getDnsAuthorityNumber();  // 获取DNS授权资源记录数
    QString getDnsAdditionalNumber();  // 获取DNS附加资源记录数
    void getDnsQueriesDomain(QString& name, int& Type, int& Class);  // 获取DNS查询域名信息
    QString getDnsDomainType(int type);  // 获取DNS域名类型
    QString getDnsDomainName(int offset);  // 获取DNS域名
    int getDnsAnswersDomain(int offset, QString& name1, u_short& Type, u_short& Class, u_int& ttl, u_short& dataLength, QString& name2);  // 获取DNS应答域名信息

    QString iptos(u_int in);  // IP地址转字符串
#define NTOHS(A) ((((A)&0xFF00)>>8) | (((A)&0x00FF)<<8))  // 16位网络字节序转主机字节序
#define NTOHSL(A) ((((A) & 0xff000000) >> 24) | \
                   (((A) & 0x00ff0000) >>  8) | \
                   (((A) & 0x0000ff00) <<  8) | \
                   (((A) & 0x000000ff) << 24))  // 32位网络字节序转主机字节序

private:
    u_int data_length;  // 数据包长度
    QString timeStmp;  // 时间戳
    QString info;  // 信息
    int package_type;  // 包类型

protected:
    static QString byteToString(u_char* str, int size);  // 字节数组转字符串
public:
    const u_char* pkt_content;  // 数据包内容指针
};

#endif // DATAPACKAGE_H
